#ifndef		__WATCHER_H_INCLUDED__
#define		__WATCHER_H_INCLUDED__

#include	"json.h"

#include	<cstdio>
#include	<functional>

#define		GWatcher	Watcher::Instance()

class Watcher {
public:
	enum EStatus {
		Stopped	= 0,
		Running	= 1,
		Fatal	= 2,
		Retry	= 3,
	};

	typedef struct Info {
		EStatus		emStatus;
		int			nFd;
		int			nPid;
		char		pTail[16384];
		int			nTail;
		int			nRetry;
		std::string	sCmd;
		std::string	sPath;
	} Info;

	typedef std::function<void(const std::string &, const Json::Value &)> Notifier;

public:
	Watcher() {}

	static Watcher &	Instance();

	void	SetNotifier(Notifier fNotifier) { _fNotifier = fNotifier; }
	void	Breath();

	void	Start(const std::string & sName, const std::string & sPath, const std::string & sCmd, int nRetry);
	void	Stop(const std::string & sName);
	void	StopAll();
	void	Remove(const std::string & sName);
	Info *	Get(const std::string & sName);

private:
	void	Notify(const std::string & sScope, const Json::Value & rMsg);
	void	Tail(const std::string & sName, Info & rInfo);
	void	AppendTail(const std::string & sName, Info & rInfo, const std::string & sTail);
	void	CatchExit(const std::string & sName, Info & rInfo, int nStatus, bool bRetry = false);

private:
	std::map<std::string, Info>	_mWatcher;
	Notifier					_fNotifier;
};

#endif//!	__WATCHER_H_INCLUDED__